package Day_0202.Spring;

/**
 * @author zxc
 * @date 2023/02/02 21:02
 **/
public class Spring_ApplicationContext_BeanFactory {
    public static void main(String[] args) {
        /**
         * 说说Spring 中 ApplicationContext 和 BeanFactory 的区别
         * ===》
         * 1.包目录不同
         * （1）spring-beans.jar 中 org.springframework.beans.factory.BeanFactory
         * （2）spring-context.jar 中 org.springframework.context.ApplicationContext
         *
         * 2.国际化
         * （1）BeanFactory 是不支持国际化功能的，因为 BeanFactory 没有扩展 Spring 中 MessageResource接口。
         * （2）相反，由于 ApplicationContext 扩展了 MessageResource 接口，因而具有消息处理的能力（i18N）。
         *
         * 3.强大的事件机制（Event）
         * （1）基本上牵涉到事件（Event）方面的设计，就离不开观察者模式，
         * （2）ApplicationContext 的事件机制主要通过 ApplicationEvent 和 ApplicationListener 这两个接口来提供的，
         *  和 Java swing 中的事件机制一样。
         *  即，当 ApplicationContext 中发布一个事件时，所有扩展了 ApplicationListener 的 Bean都将接受到这个事件，并进行相应的处理。
         *
         * 4.底层资源的访问
         * （1）ApplicationContext 扩展了 ResourceLoader（资源加载器）接口，从而可以用来加载多个Resource，
         * （2）而 BeanFactory 是没有扩展 ResourceLoader。
         *
         * 5.对 Web 应用的支持
         * （1）BeanFactory 通常以编程的方式被创建，
         * （2）ApplicationContext 能以声明的方式创建，如使用ContextLoader。
         *  当然你也可以使用 ApplicationContext 的实现方式之一，以编程的方式创建 ApplicationContext实例。
         *
         * 6.延迟加载
         * （1）BeanFactroy 采用的是延迟加载形式来注入 Bean 的，
         *  即，只有在使用到某个 Bean 时(调用getBean())，才对该 Bean 进行加载实例化。
         * （2）而 ApplicationContext 则相反，它是在容器启动时，一次性创建了所有的 Bean。
         *
         * 7.BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用。
         * 两者之间的区别是：
         * （1）BeanFactory 需要手动注册，
         * （2）ApplicationContext 则是自动注册。
         *
         * ===》
         * 总结 ：
         * （1）ApplicationContext 继承了 BeanFactory，BeanFactory 是 Spring 中比较原始的Factory，它不支持 AOP、Web 等 Spring 插件。
         * （2）而 ApplicationContext 不仅包含了 BeanFactory的所有功能，还支持 Spring 的各种插件，
         *  还以一种面向框架的方式工作以及对上下文进行分层和实现继承。
         * （3）BeanFactory 是 Spring 框架的基础设施，面向 Spring 本身；
         * （4）而 ApplicationContext 面向使用Spring 的开发者，
         *  相比 BeanFactory 提供了更多面向实际应用的功能，几乎所有场合都可以直接使用 ApplicationContext，而不是底层的 BeanFactory。
         *
         * 8.常用容器
         * （1）BeanFactory 类型的有 XmlBeanFactory，它可以根据 XML 文件中定义的内容，创建相应的Bean。
         * （2）ApplicationContext 类型的常用容器有：
         *  a.ClassPathXmlApplicationContext：
         *  从 ClassPath 的 XML 配置文件中读取上下文，并生成上下文定义。应用程序上下文从程序环境变量中取得。
         *
         *  b.FileSystemXmlApplicationContext：
         *  由文件系统中的 XML 配置文件读取上下文。
         *
         *  c.XmlWebApplicationContext：
         *  由 Web 应用的 XML 文件读取上下文。例如我们在 Spring MVC使用的情况。
         *
         */
    }
}
